package com.secxiot.provider.task.controller;

import com.secxiot.api.task.TaskApi;
import com.secxiot.common.annotation.Log;
import com.secxiot.common.exception.BaseException;
import com.secxiot.provider.task.dto.TaskDto;
import com.secxiot.provider.task.dto.TaskSosDto;
import com.secxiot.provider.task.dto.TaskTransferListDto;
import com.secxiot.provider.task.dto.TaskVisitDto;
import com.secxiot.provider.task.service.TaskService;
import com.secxiot.provider.task.vo.*;
import org.apache.ibatis.annotations.Param;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

@RestController("tasks")
public class TaskProviderController implements TaskApi {

    private static final Logger LOG = LoggerFactory.getLogger(TaskProviderController.class);

    @Autowired
    TaskService taskService;

    @Log("获取用户给时间段任务")
    @GetMapping
    @Override
    public TaskHomeVo listUnfinishedByUserIdAndTime(
            @RequestParam Long userId,
            @RequestParam Long pageNo,
            @RequestParam Long pageSize,
            @RequestParam Date since,
            @RequestParam(value = "last", required = false) Date last) {

        return taskService.listUnfinishedByUserIdAndTime(userId, pageNo * pageSize, pageSize, since, last);
    }

    @Log("发布任务")
    @PostMapping
    @Override
    public Long publish(TaskDto taskDto) {
        return taskService.publish(taskDto);
    }

    @PostMapping("transfer")
    @Override
    public Long publish(TaskTransferListDto taskTransferListDto) {
        // TODO 完成交接任务，填充前端未给出的默认值
        return taskService.publishTransfer(taskTransferListDto);
    }

    /**
     * 发布sos任务
     *
     * @param sosDto SOS任务内容
     * @return
     */
    @PostMapping("sos")
    @Override
    public Long publishSosTask(TaskSosDto sosDto) throws BaseException {
        return taskService.publishSosTask(sosDto);
    }

    /**
     * 发布出诊任务
     *
     * @param visitDto SOS出诊任务内容
     * @return 任务id
     */
    @Override
    public Long publishSosVisit(TaskVisitDto visitDto) throws BaseException {
        return taskService.publishSosVisit(visitDto);
    }

    /**
     * 根据患者id查询SOS任务状态
     *
     * @param userId 患者id
     * @return
     * @throws BaseException 无任务
     */
    @Override
    public TaskSOSStatusVo getSOSTaskStatusByPatientId(
            @RequestParam(value = "userId", required = true) Long userId,
            @RequestParam(value = "taskId", required = false) Long taskId) throws BaseException {
        return taskService.getSOSTaskStatusByPatientId(userId, taskId);
    }

    /**
     * 获取sos疾病列表
     *
     * @param userId
     * @return
     */
    @Override
    public List<SosDiseaseVo> getDisease(Long userId) throws BaseException {
        return taskService.getDisease(userId);
    }

    /**
     * 获取患者检测数据模版
     *
     * @param deptId 部门id
     * @return 患者检测数据模版列表
     */
    @Override
    public List<TaskTempVo> getTaskTemp(Long deptId) {
        return taskService.getTaskTemp(deptId);
    }

    /**
     * 更新任务状态信息
     *
     * @param userId        用户id
     * @param taskId        任务id
     * @param confirmStatus 状态
     * @return 任务状态信息
     * @throws BaseException
     */
    @Override
    public TaskStatusUpdateVo updateStatus(Long userId, Long taskId, String confirmStatus) throws BaseException {
        return taskService.updateStatus(userId, taskId, confirmStatus);
    }

    /**
     * 获取已发布任务
     *
     * @param userId   用户id
     * @param pageNo   页码
     * @param pageSize 条数
     * @return 已发布任务列表
     */
    @Override
    public List<TaskDisplayVo> getPublishedList(Long userId, Long pageNo, Long pageSize) {
        return taskService.getPublishedList(userId, pageNo * pageSize, pageSize);
    }

    /**
     * 获取我的科室任务
     *
     * @param deptId   部门id
     * @param pageNo   页码
     * @param pageSize 条数
     * @return 我的科室任务列表
     */
    @Override
    public List<TaskDisplayVo> getDepartmentList(Long deptId, Long pageNo, Long pageSize) {
        return taskService.getDepartmentList(deptId, pageNo * pageSize, pageSize);
    }

    /**
     * 获取已发布任务:按任务类型区分
     *
     * @param userId   用户id
     * @param taskType 任务类型
     * @param pageNo   页码
     * @param pageSize 条数
     * @return 按任务类型区分的已发布任务列表
     */
    @Override
    public List<TaskDisplayVo> getReleasedList(Long userId, String taskType, Long pageNo, Long pageSize) {
        return taskService.getReleasedList(userId, taskType, pageNo * pageSize, pageSize);
    }

    @Override
    public TaskStatisticsVo getStatistics(Long userId, Long deptId, Integer year, Integer month) {
        return taskService.getStatistics(userId, deptId, year, month);
    }

    /**
     * 获取已接收任务:按任务类型区分
     *
     * @param userId   用户id
     * @param taskType 任务类型
     * @param pageNo   页码
     * @param pageSize 条数
     * @return 已经接收的各种任务类型的列表
     */
    @Override
    public List<TaskDisplayVo> getReceivedList(Long userId, String taskType, Long pageNo, Long pageSize) {
        return taskService.getReceivedList(userId, taskType, pageNo * pageSize, pageSize);
    }

    /**
     * 获取任务统计数据
     *
     * @param type     任务类型(1:接收; 2:发布)
     * @param userId   用户ID
     * @param dateTime 时间节点
     * @return
     */
    @Override
    public TaskCountResultVo getTaskCountResultVo(Integer type, Long userId, Date dateTime) {
        return taskService.getTaskCountResultVo(type, userId, dateTime);
    }

    /**
     * 获取各种类型的最新一条任务
     *
     * @param userId   用户id
     * @param taskType 任务类型
     * @return 一条该类型的最新任务
     */
    @Override
    public TaskDisplayVo getNewestTask(Long userId, String taskType) {
        return taskService.getNewestTask(userId, taskType);
    }

    /**
     * 首页按类型区分的最新任务、未确认数量
     *
     * @param userId 用户id
     * @return 各种类型的最新任务、未确认数量
     */
    @Override
    public TaskAndConfirmStatusVo getNewestTaskAndStatus(Long userId) {
        return taskService.getNewestTaskAndStatus(userId);
    }

    /**
     * 搜索任务
     *
     * @param userId     用户id
     * @param searchName 发布人&内容 搜索
     * @param taskType   任务类型
     * @param type       搜索类型(1:接收; 2:发布)
     * @param pageNo     页码
     * @param pageSize   条数
     * @return
     */
    @Override
    public List<TaskDisplayVo> getSearchTaskList(Long userId, String searchName, String taskType, Integer type, Long pageNo, Long pageSize) {
        return taskService.getSearchTaskList(userId, searchName, taskType, type, pageNo * pageSize, pageSize);
    }

    /**
     * 获取对应的sos任务ID
     *
     * @param taskId 出诊任务ID
     * @param userId
     * @return
     */
    @Override
    public Long getSosTaskId(@Param("taskId") Long taskId, @Param("userId") Long userId) {
        return taskService.getSosTaskId(taskId, userId);
    }

    /**
     * sos 上报位置
     *
     * @param taskId
     * @param longitude
     * @param latitude
     */
    @Override
    public Long sosReportLocation(@Param(value = "userId") Long userId,
                                  @Param(value = "taskId") Long taskId,
                                  @Param(value = "longitude") BigDecimal longitude,
                                  @Param(value = "latitude") BigDecimal latitude) {
        return taskService.sosReportLocation(userId, taskId, longitude, latitude);
    }

    /**
     * 获取医院救护车位置
     *
     * @param hospitalId 医院id
     * @return
     */
    @Override
    public List<SosPlatformVo> sosAmbulanceLocation(@Param(value = "hospitalId") Long hospitalId) {
        return taskService.sosAmbulanceLocation(hospitalId);
    }

    /**
     * 获取车辆列表
     *
     * @return
     */
    @Override
    public List<RemindAmbulanceVo> getAmbulanceVoList(@Param(value = "hospitalId") Long hospitalId) {
        return taskService.getAmbulanceVoList(hospitalId);
    }

    /**
     * 增加任务车辆记录
     *
     * @return
     */
    @Override
    public TaskStatusUpdateVo saveTaskAmbulance(@Param(value = "userId") Long userId,
                                                @Param(value = "taskId") Long taskId,
                                                @Param(value = "ambulanceId") Long ambulanceId,
                                                @Param(value = "confirmStatus") String confirmStatus) throws BaseException {
        return taskService.saveTaskAmbulance(userId, taskId, ambulanceId, confirmStatus);
    }

    /**
     * 发送视频请求
     *
     * @param taskId 任务id
     * @return
     */
    @Override
    public int updateReportVideoTask(@Param(value = "taskId") Long taskId, @Param(value = "userId") Long userId, @Param(value = "videoStatus") Integer videoStatus) {
        return taskService.updateReportVideoTask(taskId, userId, videoStatus);
    }
}
